package singleton;

import thread.ThreadUtils;

public class LazySingleton {

    private static LazySingleton uniqueInstance;

    private LazySingleton() {
    }

    /**
     * 如果不加synchronized关键字，可能存在线程安全问题：
     * 线程A调用getInstance方法，uniqueInstance为null，此时尚未执行uniqueInstance = new LazySingleton()，
     * 线程B也开始调用getInstance方法，uniqueInstance也为null，又准备执行一次uniqueInstance = new LazySingleton()，
     * 这样线程A和线程B都分别new了一个uniqueInstance，但并非同一实例。
     */
    public static synchronized LazySingleton getInstance() {
        if (uniqueInstance == null) {
            ThreadUtils.sleep(100); //模拟耗时操作
            uniqueInstance = new LazySingleton();
        }
        return uniqueInstance;
    }

}
